/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package persistencia;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.logging.Level;
import java.util.logging.Logger;
import modelo.Categoria;

/**
 *
 * @author Felipe
 */
public class CategoriaDAO {

    private Connection conexion;

    public Connection getConexion() {
        return conexion;
    }

    public void setConexion(Connection conexion) {
        this.conexion = conexion;
    }

    public void Insertar(Categoria cate) {
        PreparedStatement sentencia = null;

        try {
            String nombre = cate.getNombre();
            String descripcion = cate.getDescripcion();
            int codCat = cate.getCodCategoria();

            String sql = "insert into CATEGORIAS (COD_CATEGORIA,NOMBRE,DESCRIPCION,ESTADO) values(?,?,?,?)";
            sentencia = conexion.prepareStatement(sql);

            sentencia.setInt(1, codCat);
            sentencia.setString(2, nombre);
            sentencia.setString(3, descripcion);
            sentencia.setBoolean(4, true);

            sentencia.executeUpdate();

//          sentencia.executeUpdate(sql);
        } catch (SQLException ex) {
            //TODO Gestionar mejor esta exception
            ex.printStackTrace();
        } finally {
            try {
                sentencia.close();
            } catch (Exception noGestionar) {
            }

        }

    }

    public Categoria buscar(int codigo) {
        Categoria registro = null;
        PreparedStatement sentencia = null;
        ResultSet resultado = null;
        try {
            String sql = "select *  from CATEGORIAS where COD_CATEGORIA = ?"; // idx :1
            sentencia = conexion.prepareStatement(sql);
            sentencia.setInt(1, codigo);
            resultado = sentencia.executeQuery();

            if (resultado.next()) {
                registro = new Categoria();

                registro.setNombre(resultado.getString("NOMBRE"));
                registro.setDescripcion(resultado.getString("DESCRIPCION"));
                registro.setCodCategoria(resultado.getInt("COD_CATEGORIA"));
                registro.setEstado(resultado.getBoolean("ESTADO"));
            }
        } catch (SQLException ex) {
            ex.printStackTrace();
            throw new RuntimeException("CategoriaDAO.buscar: " + codigo, ex);
        } finally {
            try {
                resultado.close();
            } catch (Exception noGestionar) {
            }
            try {
                sentencia.close();
            } catch (Exception noGestionar) {
            }
        }
        return registro;
    }

    public Collection<Categoria> buscarTodos() {
        Collection<Categoria> lista = new ArrayList<Categoria>();
        PreparedStatement sentencia = null;
        ResultSet resultado = null;
        try {
            String sql = "select * from CATEGORIAS";
            sentencia = conexion.prepareStatement(sql);
            resultado = sentencia.executeQuery();
            try {
                while (resultado.next()) {
                    Categoria registro = new Categoria();
                    registro.setCodCategoria(resultado.getInt("COD_CATEGORIA"));
                    registro.setNombre(resultado.getString("NOMBRE"));
                    registro.setDescripcion(resultado.getString("DESCRIPCION"));
                    registro.setEstado(resultado.getBoolean("ESTADO"));
                    // finalmente, agregar a la coleccion
                    lista.add(registro);
                }
            } catch (NullPointerException ex) {
                return null;

            }

        } catch (SQLException ex) {
            //TODO Gestionar mejor esta exception
            ex.printStackTrace();
        } finally {
            try {
                resultado.close();
            } catch (Exception noGestionar) {
            }
            try {
                sentencia.close();
            } catch (Exception noGestionar) {
            }
        }
        return lista;
    }

    public void modificar(Categoria cate) {
        PreparedStatement sentencia = null;

        try {
            String nombre = cate.getNombre();
            int codCat = cate.getCodCategoria();
            String descripcion = cate.getDescripcion();

            String sql = "UPDATE CATEGORIAS set NOMBRE = ?,  DESCRIPCION = ? where COD_CATEGORIA = ?";
            sentencia = conexion.prepareStatement(sql);
            sentencia.setString(1, nombre);
            sentencia.setInt(3, codCat);
            sentencia.setString(2, descripcion);

            sentencia.executeUpdate();

        } catch (SQLException ex) {
            //TODO Gestionar mejor esta exception
            ex.printStackTrace();
        } finally {
            try {
                sentencia.close();
            } catch (Exception noGestionar) {
            }

        }

    }
    
    public void eliminar(int codigo, boolean estado) {
        PreparedStatement sentencia = null;
        try {
            String sql = "UPDATE CATEGORIAS SET ESTADO = ? WHERE  COD_CATEGORIA = ?";
            sentencia = conexion.prepareStatement(sql);
            sentencia.setBoolean(1, estado);
            sentencia.setInt(2, codigo);
            sentencia.executeUpdate();

        } catch (SQLException ex) {
            throw new RuntimeException("error al eliminar categoria", ex);
        }finally{
            try {
                sentencia.close();
            } catch (SQLException ex) {
                Logger.getLogger(CategoriaDAO.class.getName()).log(Level.SEVERE, null, ex);
            }
    }
    }

    Categoria buscarPorNombre(String nombre) {
        PreparedStatement sentencia = null;
        Categoria registro = null;
        ResultSet resultado = null;
        try {
            String sql = "select *  from CATEGORIAS where NOMBRE = ?";
            sentencia = conexion.prepareStatement(sql);
            sentencia.setString(1, nombre);
            resultado = sentencia.executeQuery();
            if (resultado.next()) {
                registro = new Categoria();

                registro.setNombre(resultado.getString("NOMBRE"));
                registro.setCodCategoria(resultado.getInt("COD_CATEGORIA"));
                registro.setDescripcion(resultado.getString("DESCRIPCION"));
            }
        } catch (SQLException ex) {
        }
        return registro;
    }

    int getCodCate() {
        PreparedStatement sentencia = null;
        int codigo = -11;
        ResultSet resultado = null;
        try {
            String sql = "SELECT MAX(COD_CATEGORIA) AS CODIGO FROM CATEGORIAS";
            sentencia = conexion.prepareStatement(sql);

            resultado = sentencia.executeQuery();
            if (resultado.next()) {

                codigo = (resultado.getInt("CODIGO"));
            }

        } catch (SQLException ex) {

        }
        return codigo;
    }

}
